package com.xdap.common.utils;

import com.alibaba.fastjson.JSONObject;
import com.google.gson.*;
import com.google.gson.reflect.TypeToken;
import org.springframework.util.StringUtils;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

/**
 * json 工具
 */
public class GsonUtil {
    private static final Gson GSON = new GsonBuilder()
            .setDateFormat("yyyy-MM-dd HH:mm:ss")
            .disableHtmlEscaping()
            .create();

    /**
     * 对象转json
     *
     * @param obj
     * @return
     */
    public static String toJson(Object obj) {
        if (obj == null) {
            return null;
        }
        return GSON.toJson(obj);
    }

    /**
     * json转对象
     *
     * @param json
     * @param <T>
     * @return
     */
    public static <T> T toObj(String json, Class<T> cls) {
        if (StringUtils.hasLength(json)) {
            return GSON.fromJson(json, cls);
        }
        return null;
    }

    public static <T> T toObj(JSONObject json, Class<T> cls) {
        if (json != null) {
            return  JSONObject.toJavaObject(json, cls);
        }
        return null;
    }

    /**
     * json转对象列表
     *
     * @param json
     * @param <T>
     * @return
     */
    public static <T> List<T> toList(String json, Class<T> cls) {
        if (!StringUtils.hasLength(json)) {
            return null;
        }
        List<T> list = new ArrayList<>();
        JsonArray array = JsonParser.parseString(json).getAsJsonArray();
        for (final JsonElement elem : array) {
            list.add(GSON.fromJson(elem, cls));
        }
        return list;
    }

    /**
     * json转map
     *
     * @param json
     * @return
     */
    public static <T> Map<String, T> toMap(String json) {
        if (StringUtils.hasLength(json)) {
            return GSON.fromJson(json, new TypeToken<Map<String, T>>() {
            }.getType());
        }
        return null;
    }

    /**
     * 对象转map
     *
     * @param obj
     * @return
     */
    public static <T> Map<String, T> toMap(Object obj) {
        String s = toJson(obj);
        return StringUtils.hasLength(s) ? toMap(s) : null;
    }
}
